const { createUser, getUserInfo, deleteById, deleteByIds, 
    getUserMenuList, getUserMenuAndButtons, updatePassword } = require('@/service/user'); // 引入用户服务
const { updateUser, login, getUserList } = require('@/service/user');
const Response = require('@/utils/response')
const {uploadToQiniu} = require('@/utils/qiniuUpload');
const captchaService = require('@/service/captcha');
class UserController {

  async register(ctx) { // 注册
    try {
      const {captcha, captchaKey, ...params} = ctx.request.body;
      if (!captcha || !captchaKey) {
        // return Response.error(ctx, '验证码不能为空', 400);
      } else {
        const isValid = await captchaService.verify(captcha, captchaKey);
        if (!isValid) {
          return Response.error(ctx, '验证码错误', 400);
        }
      }
      // const res = await ctx.service.user.createUser(params); // 调用服务层创建用户
      const res = await createUser(params); // 调用服务层创建用户
      if(res) {
        return Response.success(ctx, res, '注册成功');
      } else {
        return Response.error(ctx, '注册失败', 500);
      }
    } catch (error) {
      // 处理错误
      return Response.error(ctx, '注册失败：'+error.message, 500);
    }  
  }
  async login(ctx) {
    try {
      const { username, password, captcha, captchaKey, } = ctx.request.body;
      if (!captcha || !captchaKey) { // 管理系统还没有验证码功能 暂时取消验证码
        // return Response.error(ctx, '验证码不能为空', 400);
      } else { 
        const isValid = await captchaService.verify(captcha, captchaKey);
        if (!isValid) {
          return Response.error(ctx, '验证码错误', 400);
        }
      }
      const ip = ctx.request.ip;
      console.log('ip', ip);
      if (!username || !password) {
        return Response.error(ctx, '用户名和密码不能为空', 400);
      }
      // 检查用户名和密码是否正确
      const user = await login({ username, password, ip });
      if (!user) {
        return Response.error(ctx, '用户名或密码错误', 400);
      } else if(!user.token) {
        return Response.error(ctx, user.message, user.code || 401);
      }
      // 登录成功，返回用户信息
      return Response.success(ctx, user, '登录成功');
    } catch (error) {
      return Response.error(ctx, '登录失败：' + error.message, 500, error);
    }
  }

  async getUserList(ctx) { // 获取用户列表
    try {
      const res = await getUserList();
      if(!res) {
        return Response.error(ctx, '获取用户列表失败', 500);
      } else {
        return Response.success(ctx, res, '获取用户列表成功');
      }
    } catch (error) {
      return Response.error(ctx, '获取用户列表失败', 500, error);
    }

  }
  async getUserMenuList(ctx) { // 获取用户菜单列表
    const id = ctx.state.user.id;
    const menuList = await getUserMenuList(id);
    if(!menuList) {
      return Response.error(ctx, '获取用户菜单列表失败', 500);
    } else {
      return Response.success(ctx, menuList, '获取用户菜单列表成功');
    }
  }
  async getUserMenuAndButtons(ctx) {
    try {
      const userId = ctx.state.user.id;
      const res = await getUserMenuAndButtons(userId);
      if (res) {
        return Response.success(ctx, res, '获取用户菜单和按钮权限成功');
      } else {
        return Response.error(ctx, '获取用户菜单和按钮权限失败', 500);
      }
    } catch (error) {
      return Response.error(ctx, '获取用户菜单和按钮权限失败', 500, error);
    }
  }
  async getUserInfo(ctx) { // 获取用户信息
    let queryData = ctx.request.query; // 获取query参数
    
    // 如果query为空，使用token中的用户信息
    if (Object.keys(queryData).length === 0) {
      queryData = { id: ctx.state.user.id };
    }
    // 查询用户信息
    try {
      const res = await getUserInfo(queryData); // 调用服务层获取用户信息
      if (!res) {
        return Response.error(ctx, '用户不存在', 404);
      }
      return Response.success(ctx, res, '获取用户信息成功');
    } catch (error) {
      return Response.error(ctx, '获取用户信息失败：' + error.message, 500,error);
    }
  }
  async deleteById(ctx) { // 删除用户
    try {
      const { id } = ctx.request.body; // 获取用户ID
      if (!id) {
        return Response.error(ctx, '用户ID不能为空', 400);
      }
      // 删除用户
      const res = await deleteById(id); // 调用服务层删除用户
      if (!res) {
        return Response.error(ctx, '用户不存在', 404);
      }

      return Response.success(ctx, res, '删除用户成功');

    } catch (error) {
        return Response.error(ctx, '删除用户失败：' + error.message, 500, error);
    }
  }
  //  批量删除
  async deleteByIds(ctx) { // 批量删除用户
    try {
      const { ids } = ctx.request.body; // 获取用户ID数组
      if (!ids || !Array.isArray(ids)) {
        return Response.error(ctx, '用户ID不能为空', 400);
      }
      // 删除用户
      const res = await deleteByIds(ids); // 调用服务层删除用户
      if (!res) {
        return Response.error(ctx, '用户不存在', 404);
      }

      return Response.success(ctx, res, '批量删除用户成功');

    } catch (error) {
        return Response.error(ctx, '批量删除用户失败：' + error.message, 500, error);
    }
  }

  async updateById(ctx) { // 修改用户信息
    try {
      const { id, username, nickname, qq, email, roleIds, avatar } = ctx.request.body;
      let newAvatar = avatar;
      const files = ctx.request.files;
      if( files && files.avatar) {
        newAvatar = await uploadToQiniu(files.avatar);
      }
      const res = await updateUser({ id, nickname, username,qq, email, roleIds, avatar: newAvatar });
      if (!res) {
        return Response.error(ctx, '操作失败', 500);
      }

      return Response.success(ctx, res, '修改用户信息成功');
    } catch (error) { // 捕获异常
      return Response.error(ctx, '修改用户信息失败：' + error.message, 500, error);
    }
  }

  async updatePassword(ctx) { // 修改密码
    const { id, oldPassword, newPassword } = ctx.request.body;
    let userId = id || ctx.state.user.id; // 获取用户id
    if(!userId || !oldPassword || !newPassword) {
      return Response.error(ctx, '用户ID、旧密码、新密码不能为空', 400);
    }
    if(oldPassword === newPassword) {
      return Response.error(ctx, '新密码不能与旧密码相同', 400);
    }
    const res = await updatePassword(userId, oldPassword, newPassword);
    return Response.success(ctx, res, '密码修改成功');
  }
}

// 导出 UserController 类
module.exports = new UserController();
